package administracion.managedBean.usuarios;

import Entities.Cliente;
import Entities.Externo;
import Entities.ItemProducto;
import Entities.Reserva;
import ejb.ClienteFacadeLocal;
import ejb.Condicional;
import ejb.ExternoFacadeLocal;
import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.context.RequestContext;
import org.primefaces.model.LazyDataModel;
import sesion.PermisoPagina;
import tablemodel.GeneralLazyModel;
import util.PageCodeGenerico;

@ManagedBean
@ViewScoped
public class PCAutogestion extends PageCodeGenerico implements Serializable {

    @EJB
    private ExternoFacadeLocal externoFacade;
    @EJB
    private ClienteFacadeLocal clienteFacade;
    private Cliente cliente;
    private Date fechaNac;
    private Externo temporal;
    private String contraseniaNueva;
    private LazyDataModel<Reserva> listadoReservas;
    private LazyDataModel<Externo> listadoPedidosExternos;
    private String fechaActual;
    private List<ItemProducto> listaItemsProductos;
    private double totalPrecio;

    public PCAutogestion() {
        super();
        this.temporal = new Externo();
        this.contraseniaNueva = "";
        Calendar cal = Calendar.getInstance();
        fechaActual = cal.get(Calendar.DATE) + "/" + (cal.get(Calendar.MONTH) + 1) + "/" + cal.get(Calendar.YEAR);
        listaItemsProductos = new ArrayList();
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public Date getFechaNac() {
        return fechaNac;
    }

    public void setFechaNac(Date fechaNac) {
        this.fechaNac = fechaNac;
    }

    public String getContraseniaNueva() {
        return contraseniaNueva;
    }

    public void setContraseniaNueva(String contraseniaNueva) {
        this.contraseniaNueva = contraseniaNueva;
    }

    public LazyDataModel<Reserva> getListadoReservas() {
        return listadoReservas;
    }

    public void setListadoReservas(LazyDataModel<Reserva> listadoReservas) {
        this.listadoReservas = listadoReservas;
    }

    public LazyDataModel<Externo> getListadoPedidosExternos() {
        return listadoPedidosExternos;
    }

    public void setListadoPedidosExternos(LazyDataModel<Externo> listadoPedidosExternos) {
        this.listadoPedidosExternos = listadoPedidosExternos;
    }

    public String getFechaActual() {
        return fechaActual;
    }

    public void setFechaActual(String fechaActual) {
        this.fechaActual = fechaActual;
    }

    public List<ItemProducto> getListaItemsProductos() {
        return listaItemsProductos;
    }

    public void setListaItemsProductos(List<ItemProducto> listaItemsProductos) {
        this.listaItemsProductos = listaItemsProductos;
    }

    public double getTotalPrecio() {
        return totalPrecio;
    }

    public void setTotalPrecio(double totalPrecio) {
        this.totalPrecio = totalPrecio;
    }

    public Externo getTemporal() {
        return temporal;
    }

    public void setTemporal(Externo temporal) {
        this.temporal = temporal;
    }

    @PostConstruct
    public void cargarUsuario() {
        try {
            this.fechaNac = null;
            cliente = clienteFacade.buscarPorId(super.getMi_sesion().getUsuario().getId());
            //Reservas
            Reserva reserva = new Reserva();
            reserva.setCliente(this.cliente);
            reserva.setActivo(true);
            this.fechaNac = this.convertirCalendarADate(cliente.getFechaNac());
            GeneralLazyModel<Reserva> glm = new GeneralLazyModel<>(new Reserva());
            List<Condicional> cs = new ArrayList<>();
            cs.add(new Condicional("cliente.id", this.cliente.getId()));
            glm.setCondicionales(cs);
            this.listadoReservas = glm;
            //Pedidos Externos
            Externo pedidoExterno = new Externo();
            pedidoExterno.setCliente(this.cliente);
            pedidoExterno.setActivo(true);
            GeneralLazyModel<Externo> glp = new GeneralLazyModel<>(new Externo());
            List<Condicional> csp = new ArrayList<>();
            csp.add(new Condicional("cliente.id", this.cliente.getId()));
            glp.setCondicionales(csp);
            this.listadoPedidosExternos = glp;
        } catch (Exception e) {
            super.setearError(e);
        }
    }

    public String guardar() {
        if (!this.contraseniaNueva.equals("")) {
            this.cliente.setContrasenia(this.contraseniaNueva);
        }
        try {
            this.cliente.setFechaNac(this.convertirDateACalendar(this.fechaNac));
            clienteFacade.editar(cliente);
            super.setearInfo("Sus datos han sido actualizados con éxito");
            RequestContext.getCurrentInstance().addCallbackParam("correcto", true);
        } catch (Exception e) {
            super.setearError(e);
            RequestContext.getCurrentInstance().addCallbackParam("correcto", false);
        }
        return "tablaAutogestion";
    }

    public Date convertirCalendarADate(Calendar calendar) {
        if (calendar != null) {
            Date date = calendar.getTime();
            return date;
        } else {
            return null;
        }
    }

    private Calendar convertirDateACalendar(Date date) {
        if (date != null) {
            Calendar cal;
            DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
            format.format(date);
            cal = format.getCalendar();
            return cal;
        } else {
            return null;
        }
    }

    public void cargarItems(int id) {
        try {
            Externo pe = externoFacade.buscarPorId(id);
            this.setListaItemsProductos(pe.getListaItemsProductos());
            this.setTotalPrecio(0);
            double total = 0;
            for (ItemProducto ip : getListaItemsProductos()) {
                total += ip.getCantidad() * ip.getPrecioVigente();
            }
            this.setTotalPrecio(total);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
    /**
     * Devuelve los permisos de la pagina.
     *
     * @return
     */
    public PermisoPagina consultarPermisos() {
        if (getMi_sesion() != null) {
            return getMi_sesion().consultarPermisos(Externo.class);
        } else {
            return new PermisoPagina();
        }
    }

    public void eliminar() {
        if (consultarPermisos().isBaja()) {
            if (this.temporal != null) {
                try {
                    externoFacade.eliminar(this.temporal);
                    setearInfo("Operación finalizada correctamente.");
                } catch (Exception e) {
                    setearError(e);
                }
            } else {
                setearInfo("Nada que eliminar.");
            }
        }

    }

    public void establecerTemporal(Externo objeto) {
        this.temporal = (objeto == null) ? new Externo() : objeto;
    }

    public boolean setVerFecha(Date fecha) {
        Calendar calC = Calendar.getInstance();
        int anioC = calC.get(Calendar.YEAR);
        int mesC = calC.get(Calendar.MONTH);
        int diaC = calC.get(Calendar.DAY_OF_MONTH);
        int horaC = calC.get(Calendar.HOUR_OF_DAY);
        int minC = calC.get(Calendar.MINUTE);
        int segC = calC.get(Calendar.SECOND);
        calC.set(anioC, mesC, diaC, horaC, minC, segC);

        Calendar fechaIn = Calendar.getInstance();
        fechaIn.setTime(fecha);
        int anio = fechaIn.get(Calendar.YEAR);
        int mes = fechaIn.get(Calendar.MONTH);
        int dia = fechaIn.get(Calendar.DAY_OF_MONTH);
        int hora = fechaIn.get(Calendar.HOUR_OF_DAY);
        int min = fechaIn.get(Calendar.MINUTE);
        int seg = fechaIn.get(Calendar.SECOND);
        fechaIn.set(anio, mes, dia, hora, min, seg);

        long milis1 = calC.getTimeInMillis();
        long milis2 = fechaIn.getTimeInMillis();

        // calcular la diferencia en milisengundos
        long diff = milis2 - milis1;
        // calcular la diferencia en minutos
        long diffMinutes = diff / (60 * 1000);

        if (diffMinutes > -5) {
            return false;
        } else {
            return true;
        }
    }
}
